rm(list = ls())
source("C:/Users/mbofi/Dropbox/CeMSIIS/GitHub/Allocation/case-study/aux_functions.R") #local
# setwd("C:/Users/mbofi/Dropbox/CeMSIIS/GitHub/Allocation/case-study")#local
# setwd("~/GitHub/Allocation/case-study")

library(tidyverse)
library(dplyr)
library(plyr)
library(NCC)
library(mmtable2)
library(gt)
# OPTIMAL ALLOCATION USING OLD NOTATION
##########################################
# Simulation function
# modification of sim_designs() function
# also returning the matrix (r_is)
##########################################

sim_designs_rr <- function(r1,r2,mu0,mu1,mu2,N,alloc="sqrt",trend="stepwise",sl=0.2){
  
  r3 = 1-r1-r2
  
  if(r1 == 1){
    
    if(alloc == "one"){
      r22 <- r11 <- r01 <- r1/3
      r02 <- r12 <- r23 <- r03 <- 0
    }
    if(alloc != "one"){ 
      r01 <- sqrt(2)/(2+sqrt(2))
      r22 <- r11 <- (1-r01)/2 
      r02 <- r12 <- r23 <- r03 <- 0
    }
    
  }else{
    
    if(alloc == "opt"){ 
      
      r11 <- r01 <- r1/2
      
      r2_opt <- f(r1=r1,r2=r2)
      r02 <- r2_opt[3]
      r12 <- r2_opt[4]
      r22 <- r2_opt[5]
      
      r23 <- r03 <- r3/2
      
    }
    if(alloc == "one"){
      r11 <- r01 <- r1/2
      r22 <- r12 <- r02 <- r2/3
      r23 <- r03 <- r3/2
    }
    if(alloc == "sqrt"){
      r11 <- r01 <- r1/2
      r02 <- r2*sqrt(2)/(2+sqrt(2))
      r22 <- r12 <- (r2-r02)/2
      r23 <- r03 <- r3/2
    }
    
  }
  # c(r11,r01)
  
  n11 = round(r11*N)
  n01 = round(r01*N)
  
  n22 = round(r22*N)
  n12 = round(r12*N)
  n02 = round(r02*N)
  
  n23 = round(r23*N)
  n03 = round(r03*N)
  
  # c(r11,r01,r22,r12,r02,r23,r03)
  # c(n11,n01,n22,n12,n02,n23,n03)
  
  means = c(mu0,mu1,mu2)
  
  treatment = c(
    sample(c(rep(1,n11),rep(0,n01))),
    sample(c(rep(2,n22),rep(1,n12),rep(0,n02))),
    sample(c(rep(2,n23),rep(0,n03)))
  )
  
  Nsim = length(treatment) 
  
  if(r1==1){
    treatment = sample(treatment)
    period = rep(1,Nsim)
  }else{
    period = c(
      rep(1,n11+n01),
      rep(2,n22+n12+n02),
      rep(3,n23+n03)
    )
  }
  
  if(trend=="stepwise"){
    
    response = rnorm(Nsim,
                     mean=means[treatment[1:Nsim]+1]+sw_trend(cj=period[1:Nsim], lambda=sl),
                     sd=1) 
    
  }
  if(trend=="linear"){
    
    response = rnorm(Nsim,
                     mean=means[treatment[1:Nsim]+1]+linear_trend(j=1:Nsim, lambda=sl, sample_size=c(0,Nsim)),
                     sd=1) 
  }
  
  data = data.frame(response,treatment,period)
  if(r1==1){
    ss = matrix(c(n22,n11,n01,0,n12,n02,n23,0,n03), nrow=3)
  }else{
    ss = matrix(c(0,n11,n01,n22,n12,n02,n23,0,n03), nrow=3)
  }
  r_matrix = matrix(c(0,r11,r01,r22,r12,r02,r23,0,r03), nrow=3)
  r_periods = c(r1,r2,r3)
  return(list(data=data,ss=ss,r_matrix=r_matrix,r_periods=r_periods))
}
# OPTIMAL ALLOCATION USING THE NEW NOTATION
##########################################
eq_p22 <- function(p22,r1=0.1,r2=0.8){(Power(-1 + p22,3)*(-1 + 2*r1))/((-1 + 2*p22)*(-2 + p22*(7 + p22*(-15 + p22*(19 + 2*p22*(-7 + 2*p22))))))-r2}

f_p=Vectorize(function(r1,r2) { 
  p22=uniroot(eq_p22,c(0,r2),r1=r1,r2=r2)$root
  r22 = r2*p22
  # p02 <- 1/(2-2*p22)
  p02 <- 1/(2-2*p22)-p22
  r02 <- p02*r2
  
  p12 <- 1-p02-p22
  r12 <- p12*r2
  # r12 <- r2- r02- r22
  
  sol=c(r1,r2,r02,r12,r22)
  sol
})

Solutions case study

Design 3: three-period design (symmetric design)

##########################################
# Case study
##########################################

# original study - obtained means
mean_control = 17.3/3.5
mean_arm1 = 66.2/3.5
mean_arm2 = 72.3/3.5 

##########################################
# design 3: three-period design (symmetric design)
##########################################
N = 92
N1 = round(N/3)
N3 = round(N/3)
N2 = N-N1-N3
c(N1,N2,N-N1-N2)
[1] 31 30 31
alloc_str <- c("one","opt","sqrt")

Optimal allocation using the old parametrization

m <- sim_designs_rr(r1=N1/N,r2=N2/N,
                   mu0=mean_control,mu1=6,mu2=6,
                   N=N,alloc=alloc_str[2],sl=0)
  
  rownames(m$r_matrix)  <- c("Arm 2", "Arm 1", "Control")
  knitr::kable(m$r_matrix, format = "html", caption = paste(alloc_str[2]), 
               col.names = c("Period 1", "Period 2", "Period 3"), 
               row.names=T, 
               digits=3)
  
  knitr::kable(t(m$r_periods),col.names = c("Period 1", "Period 2", "Period 3"))

Optimal allocation using the new parametrization

rownames(as.matrix(r_solutions[3:5]))  <- c("Arm 2", "Arm 1", "Control")
Error in rownames(as.matrix(r_solutions[3:5])) <- c("Arm 2", "Arm 1",  : 
  could not find function "as.matrix<-"

Design 3: three-period design (non-symmetric design)

##########################################
# design 3: three-period design (non-symmetric design)
##########################################
N = 92
N1 = round(N/3)
N2 = round(2*(N-N1)/3)
c(N1,N2,N-N1-N2)

Optimal allocation using the old parametrization

m <- sim_designs_rr(r1=N1/N,r2=N2/N,
                   mu0=mean_control,mu1=6,mu2=6,
                   N=N,alloc=alloc_str[2],sl=0)
  
  rownames(m$r_matrix)  <- c("Arm 2", "Arm 1", "Control")
  knitr::kable(m$r_matrix, format = "html", caption = paste(alloc_str[2]), 
               col.names = c("Period 1", "Period 2", "Period 3"), 
               row.names=T, 
               digits=3)
  
  knitr::kable(t(m$r_periods),col.names = c("Period 1", "Period 2", "Period 3"),digits=3)

Optimal allocation using the new parametrization

r_solutions
              [,1]
r1      0.33695652
r2      0.32608696
Arm 2   0.13506964
Arm 1   0.09550527
Control 0.09551205
LS0tDQp0aXRsZTogIkNvbXBhcmlzb24gb3B0aW1hbCBhbGxvY2F0aW9uIHNvbHV0aW9ucyINCiMgYXV0aG9yOiAiTWFydGEgQm9maWxsIFJvaWciDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAzDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlIA0KICAgIHRoZW1lOiBmbGF0bHkgIA0KICAgIGluY2x1ZGVzOg0KICAgICAgYWZ0ZXJfYm9keTogZm9vdGVyLmh0bWwNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjb2xsYXBzZSA9IFRSVUUsDQogIGNvbW1lbnQgPSAiIz4iDQopDQpodG1sdG9vbHM6OnRhZ0xpc3Qocm1hcmtkb3duOjpodG1sX2RlcGVuZGVuY3lfZm9udF9hd2Vzb21lKCkpDQpgYGAgDQoNCmBgYHtyfQ0Kcm0obGlzdCA9IGxzKCkpDQpzb3VyY2UoIkM6L1VzZXJzL21ib2ZpL0Ryb3Bib3gvQ2VNU0lJUy9HaXRIdWIvQWxsb2NhdGlvbi9jYXNlLXN0dWR5L2F1eF9mdW5jdGlvbnMuUiIpICNsb2NhbA0KIyBzZXR3ZCgiQzovVXNlcnMvbWJvZmkvRHJvcGJveC9DZU1TSUlTL0dpdEh1Yi9BbGxvY2F0aW9uL2Nhc2Utc3R1ZHkiKSNsb2NhbA0KIyBzZXR3ZCgifi9HaXRIdWIvQWxsb2NhdGlvbi9jYXNlLXN0dWR5IikNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShwbHlyKQ0KbGlicmFyeShOQ0MpDQpsaWJyYXJ5KG1tdGFibGUyKQ0KbGlicmFyeShndCkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBPUFRJTUFMIEFMTE9DQVRJT04gVVNJTkcgT0xEIE5PVEFUSU9ODQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgU2ltdWxhdGlvbiBmdW5jdGlvbg0KIyBtb2RpZmljYXRpb24gb2Ygc2ltX2Rlc2lnbnMoKSBmdW5jdGlvbg0KIyBhbHNvIHJldHVybmluZyB0aGUgbWF0cml4IChyX2lzKQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnNpbV9kZXNpZ25zX3JyIDwtIGZ1bmN0aW9uKHIxLHIyLG11MCxtdTEsbXUyLE4sYWxsb2M9InNxcnQiLHRyZW5kPSJzdGVwd2lzZSIsc2w9MC4yKXsNCiAgDQogIHIzID0gMS1yMS1yMg0KICANCiAgaWYocjEgPT0gMSl7DQogICAgDQogICAgaWYoYWxsb2MgPT0gIm9uZSIpew0KICAgICAgcjIyIDwtIHIxMSA8LSByMDEgPC0gcjEvMw0KICAgICAgcjAyIDwtIHIxMiA8LSByMjMgPC0gcjAzIDwtIDANCiAgICB9DQogICAgaWYoYWxsb2MgIT0gIm9uZSIpeyANCiAgICAgIHIwMSA8LSBzcXJ0KDIpLygyK3NxcnQoMikpDQogICAgICByMjIgPC0gcjExIDwtICgxLXIwMSkvMiANCiAgICAgIHIwMiA8LSByMTIgPC0gcjIzIDwtIHIwMyA8LSAwDQogICAgfQ0KICAgIA0KICB9ZWxzZXsNCiAgICANCiAgICBpZihhbGxvYyA9PSAib3B0Iil7IA0KICAgICAgDQogICAgICByMTEgPC0gcjAxIDwtIHIxLzINCiAgICAgIA0KICAgICAgcjJfb3B0IDwtIGYocjE9cjEscjI9cjIpDQogICAgICByMDIgPC0gcjJfb3B0WzNdDQogICAgICByMTIgPC0gcjJfb3B0WzRdDQogICAgICByMjIgPC0gcjJfb3B0WzVdDQogICAgICANCiAgICAgIHIyMyA8LSByMDMgPC0gcjMvMg0KICAgICAgDQogICAgfQ0KICAgIGlmKGFsbG9jID09ICJvbmUiKXsNCiAgICAgIHIxMSA8LSByMDEgPC0gcjEvMg0KICAgICAgcjIyIDwtIHIxMiA8LSByMDIgPC0gcjIvMw0KICAgICAgcjIzIDwtIHIwMyA8LSByMy8yDQogICAgfQ0KICAgIGlmKGFsbG9jID09ICJzcXJ0Iil7DQogICAgICByMTEgPC0gcjAxIDwtIHIxLzINCiAgICAgIHIwMiA8LSByMipzcXJ0KDIpLygyK3NxcnQoMikpDQogICAgICByMjIgPC0gcjEyIDwtIChyMi1yMDIpLzINCiAgICAgIHIyMyA8LSByMDMgPC0gcjMvMg0KICAgIH0NCiAgICANCiAgfQ0KICAjIGMocjExLHIwMSkNCiAgDQogIG4xMSA9IHJvdW5kKHIxMSpOKQ0KICBuMDEgPSByb3VuZChyMDEqTikNCiAgDQogIG4yMiA9IHJvdW5kKHIyMipOKQ0KICBuMTIgPSByb3VuZChyMTIqTikNCiAgbjAyID0gcm91bmQocjAyKk4pDQogIA0KICBuMjMgPSByb3VuZChyMjMqTikNCiAgbjAzID0gcm91bmQocjAzKk4pDQogIA0KICAjIGMocjExLHIwMSxyMjIscjEyLHIwMixyMjMscjAzKQ0KICAjIGMobjExLG4wMSxuMjIsbjEyLG4wMixuMjMsbjAzKQ0KICANCiAgbWVhbnMgPSBjKG11MCxtdTEsbXUyKQ0KICANCiAgdHJlYXRtZW50ID0gYygNCiAgICBzYW1wbGUoYyhyZXAoMSxuMTEpLHJlcCgwLG4wMSkpKSwNCiAgICBzYW1wbGUoYyhyZXAoMixuMjIpLHJlcCgxLG4xMikscmVwKDAsbjAyKSkpLA0KICAgIHNhbXBsZShjKHJlcCgyLG4yMykscmVwKDAsbjAzKSkpDQogICkNCiAgDQogIE5zaW0gPSBsZW5ndGgodHJlYXRtZW50KSANCiAgDQogIGlmKHIxPT0xKXsNCiAgICB0cmVhdG1lbnQgPSBzYW1wbGUodHJlYXRtZW50KQ0KICAgIHBlcmlvZCA9IHJlcCgxLE5zaW0pDQogIH1lbHNlew0KICAgIHBlcmlvZCA9IGMoDQogICAgICByZXAoMSxuMTErbjAxKSwNCiAgICAgIHJlcCgyLG4yMituMTIrbjAyKSwNCiAgICAgIHJlcCgzLG4yMytuMDMpDQogICAgKQ0KICB9DQogIA0KICBpZih0cmVuZD09InN0ZXB3aXNlIil7DQogICAgDQogICAgcmVzcG9uc2UgPSBybm9ybShOc2ltLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbj1tZWFuc1t0cmVhdG1lbnRbMTpOc2ltXSsxXStzd190cmVuZChjaj1wZXJpb2RbMTpOc2ltXSwgbGFtYmRhPXNsKSwNCiAgICAgICAgICAgICAgICAgICAgIHNkPTEpIA0KICAgIA0KICB9DQogIGlmKHRyZW5kPT0ibGluZWFyIil7DQogICAgDQogICAgcmVzcG9uc2UgPSBybm9ybShOc2ltLA0KICAgICAgICAgICAgICAgICAgICAgbWVhbj1tZWFuc1t0cmVhdG1lbnRbMTpOc2ltXSsxXStsaW5lYXJfdHJlbmQoaj0xOk5zaW0sIGxhbWJkYT1zbCwgc2FtcGxlX3NpemU9YygwLE5zaW0pKSwNCiAgICAgICAgICAgICAgICAgICAgIHNkPTEpIA0KICB9DQogIA0KICBkYXRhID0gZGF0YS5mcmFtZShyZXNwb25zZSx0cmVhdG1lbnQscGVyaW9kKQ0KICBpZihyMT09MSl7DQogICAgc3MgPSBtYXRyaXgoYyhuMjIsbjExLG4wMSwwLG4xMixuMDIsbjIzLDAsbjAzKSwgbnJvdz0zKQ0KICB9ZWxzZXsNCiAgICBzcyA9IG1hdHJpeChjKDAsbjExLG4wMSxuMjIsbjEyLG4wMixuMjMsMCxuMDMpLCBucm93PTMpDQogIH0NCiAgcl9tYXRyaXggPSBtYXRyaXgoYygwLHIxMSxyMDEscjIyLHIxMixyMDIscjIzLDAscjAzKSwgbnJvdz0zKQ0KICByX3BlcmlvZHMgPSBjKHIxLHIyLHIzKQ0KICByZXR1cm4obGlzdChkYXRhPWRhdGEsc3M9c3Mscl9tYXRyaXg9cl9tYXRyaXgscl9wZXJpb2RzPXJfcGVyaW9kcykpDQp9DQoNCmBgYA0KDQpgYGB7cn0NCiMgT1BUSU1BTCBBTExPQ0FUSU9OIFVTSU5HIFRIRSBORVcgTk9UQVRJT04NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KZXFfcDIyIDwtIGZ1bmN0aW9uKHAyMixyMT0wLjEscjI9MC44KXsoUG93ZXIoLTEgKyBwMjIsMykqKC0xICsgMipyMSkpLygoLTEgKyAyKnAyMikqKC0yICsgcDIyKig3ICsgcDIyKigtMTUgKyBwMjIqKDE5ICsgMipwMjIqKC03ICsgMipwMjIpKSkpKSktcjJ9DQoNCmZfcD1WZWN0b3JpemUoZnVuY3Rpb24ocjEscjIpIHsgDQogIHAyMj11bmlyb290KGVxX3AyMixjKDAscjIpLHIxPXIxLHIyPXIyKSRyb290DQogIHIyMiA9IHIyKnAyMg0KICAjIHAwMiA8LSAxLygyLTIqcDIyKQ0KICBwMDIgPC0gMS8oMi0yKnAyMiktcDIyDQogIHIwMiA8LSBwMDIqcjINCiAgDQogIHAxMiA8LSAxLXAwMi1wMjINCiAgcjEyIDwtIHAxMipyMg0KICAjIHIxMiA8LSByMi0gcjAyLSByMjINCiAgDQogIHNvbD1jKHIxLHIyLHIyMixyMTIscjAyKQ0KICBzb2wNCn0pDQpgYGANCg0KDQoNCiMgU29sdXRpb25zIGNhc2Ugc3R1ZHkNCg0KIyMgRGVzaWduIDM6IHRocmVlLXBlcmlvZCBkZXNpZ24gKHN5bW1ldHJpYyBkZXNpZ24pDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDYXNlIHN0dWR5DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyBvcmlnaW5hbCBzdHVkeSAtIG9idGFpbmVkIG1lYW5zDQptZWFuX2NvbnRyb2wgPSAxNy4zLzMuNQ0KbWVhbl9hcm0xID0gNjYuMi8zLjUNCm1lYW5fYXJtMiA9IDcyLjMvMy41IA0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgZGVzaWduIDM6IHRocmVlLXBlcmlvZCBkZXNpZ24gKHN5bW1ldHJpYyBkZXNpZ24pDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCk4gPSA5Mg0KTjEgPSByb3VuZChOLzMpDQpOMyA9IHJvdW5kKE4vMykNCk4yID0gTi1OMS1OMw0KYyhOMSxOMixOLU4xLU4yKQ0KYWxsb2Nfc3RyIDwtIGMoIm9uZSIsIm9wdCIsInNxcnQiKQ0KYGBgDQoNCk9wdGltYWwgYWxsb2NhdGlvbiB1c2luZyB0aGUgb2xkIHBhcmFtZXRyaXphdGlvbg0KYGBge3J9DQptIDwtIHNpbV9kZXNpZ25zX3JyKHIxPU4xL04scjI9TjIvTiwNCiAgICAgICAgICAgICAgICAgICBtdTA9bWVhbl9jb250cm9sLG11MT02LG11Mj02LA0KICAgICAgICAgICAgICAgICAgIE49TixhbGxvYz1hbGxvY19zdHJbMl0sc2w9MCkNCiAgDQogIHJvd25hbWVzKG0kcl9tYXRyaXgpICA8LSBjKCJBcm0gMiIsICJBcm0gMSIsICJDb250cm9sIikNCiAga25pdHI6OmthYmxlKG0kcl9tYXRyaXgsIGZvcm1hdCA9ICJodG1sIiwgY2FwdGlvbiA9IHBhc3RlKGFsbG9jX3N0clsyXSksIA0KICAgICAgICAgICAgICAgY29sLm5hbWVzID0gYygiUGVyaW9kIDEiLCAiUGVyaW9kIDIiLCAiUGVyaW9kIDMiKSwgDQogICAgICAgICAgICAgICByb3cubmFtZXM9VCwgDQogICAgICAgICAgICAgICBkaWdpdHM9MykNCiAgDQogIGtuaXRyOjprYWJsZSh0KG0kcl9wZXJpb2RzKSxjb2wubmFtZXMgPSBjKCJQZXJpb2QgMSIsICJQZXJpb2QgMiIsICJQZXJpb2QgMyIpKQ0KYGBgDQoNCg0KT3B0aW1hbCBhbGxvY2F0aW9uIHVzaW5nIHRoZSBuZXcgcGFyYW1ldHJpemF0aW9uDQpgYGB7cn0gIA0Kcl9zb2x1dGlvbnMgPC0gZl9wKHIxPW0kcl9wZXJpb2RzWzFdLCByMj1tJHJfcGVyaW9kc1syXSkNCiMgcm93bmFtZXMocl9zb2x1dGlvbnNbMzo1XSkgIDwtIGMoIkFybSAyIiwgIkFybSAxIiwgIkNvbnRyb2wiKQ0Ka25pdHI6OmthYmxlKHJfc29sdXRpb25zWzM6NV0sY29sLm5hbWVzID0gYygiUGVyaW9kIDIiKSxyb3cubmFtZXM9VCxkaWdpdHM9MykNCmtuaXRyOjprYWJsZSh0KGMocl9zb2x1dGlvbnNbMToyXSwgMS1zdW0ocl9zb2x1dGlvbnNbMToyXSkpKSxjb2wubmFtZXMgPSBjKCJQZXJpb2QgMSIsICJQZXJpb2QgMiIsICJQZXJpb2QgMyIpLGRpZ2l0cz0zKSANCmBgYA0KDQoNCiMjIERlc2lnbiAzOiB0aHJlZS1wZXJpb2QgZGVzaWduIChub24tc3ltbWV0cmljIGRlc2lnbikNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIGRlc2lnbiAzOiB0aHJlZS1wZXJpb2QgZGVzaWduIChub24tc3ltbWV0cmljIGRlc2lnbikNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KTiA9IDkyDQpOMSA9IHJvdW5kKE4vMykNCk4yID0gcm91bmQoMiooTi1OMSkvMykNCmMoTjEsTjIsTi1OMS1OMikNCmBgYA0KT3B0aW1hbCBhbGxvY2F0aW9uIHVzaW5nIHRoZSBvbGQgcGFyYW1ldHJpemF0aW9uDQpgYGB7cn0NCm0gPC0gc2ltX2Rlc2lnbnNfcnIocjE9TjEvTixyMj1OMi9OLA0KICAgICAgICAgICAgICAgICAgIG11MD1tZWFuX2NvbnRyb2wsbXUxPTYsbXUyPTYsDQogICAgICAgICAgICAgICAgICAgTj1OLGFsbG9jPWFsbG9jX3N0clsyXSxzbD0wKQ0KICANCiAgcm93bmFtZXMobSRyX21hdHJpeCkgIDwtIGMoIkFybSAyIiwgIkFybSAxIiwgIkNvbnRyb2wiKQ0KICBrbml0cjo6a2FibGUobSRyX21hdHJpeCwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gcGFzdGUoYWxsb2Nfc3RyWzJdKSwgDQogICAgICAgICAgICAgICBjb2wubmFtZXMgPSBjKCJQZXJpb2QgMSIsICJQZXJpb2QgMiIsICJQZXJpb2QgMyIpLCANCiAgICAgICAgICAgICAgIHJvdy5uYW1lcz1ULCANCiAgICAgICAgICAgICAgIGRpZ2l0cz0zKQ0KICANCiAga25pdHI6OmthYmxlKHQobSRyX3BlcmlvZHMpLGNvbC5uYW1lcyA9IGMoIlBlcmlvZCAxIiwgIlBlcmlvZCAyIiwgIlBlcmlvZCAzIiksZGlnaXRzPTMpDQpgYGANCg0KDQpPcHRpbWFsIGFsbG9jYXRpb24gdXNpbmcgdGhlIG5ldyBwYXJhbWV0cml6YXRpb24NCmBgYHtyfSAgDQpyX3NvbHV0aW9ucyA8LSBmX3AocjE9bSRyX3BlcmlvZHNbMV0sIHIyPW0kcl9wZXJpb2RzWzJdKQ0KIyByb3duYW1lcyhyX3NvbHV0aW9uc1szOjVdKSAgPC0gYygiQXJtIDIiLCAiQXJtIDEiLCAiQ29udHJvbCIpDQprbml0cjo6a2FibGUocl9zb2x1dGlvbnNbMzo1XSxjb2wubmFtZXMgPSBjKCJQZXJpb2QgMiIpLHJvdy5uYW1lcz1ULGRpZ2l0cz0zKQ0Ka25pdHI6OmthYmxlKHQoYyhyX3NvbHV0aW9uc1sxOjJdLCAxLXN1bShyX3NvbHV0aW9uc1sxOjJdKSkpLGNvbC5uYW1lcyA9IGMoIlBlcmlvZCAxIiwgIlBlcmlvZCAyIiwgIlBlcmlvZCAzIiksZGlnaXRzPTMpIA0KYGBgDQo=